package com.niit.scala

/**
 * Date:2025/4/2
 * Author：Ys
 * Description:
 */
object Base09 {

  def main(args: Array[String]): Unit = {



    /*
      filter : 过滤器，根据条件过滤出满足 条件 (True/False) 的元素，返回一个新列表
         1.  1 to 9 生成一个数组，再转换成列表
         2.  将list1过滤出能够被2整除的数据 并返回一个新列表
     */
    var list1 = (1 to 9).toList
    val ls1: List[Int] = list1.filter(  _ % 2 == 0 ) //返回一个新列表
    println(ls1)

    /*
     排序：
        sorted:对集合元素进行默认排序
        sortBy:对集合按照指定字段进行排序
        sortWith:对集合按照指定条件进行排序
     */
    //1.sorted :对集合元素进行默认排序
    var list2= List(3,2,1,4,5,6,7,8,9) // 默认升序
    val ls: List[Int] = list2.sorted //将排序后的而数据返回一个新的列表
    println(ls.reverse)

    //2.sortBy
    var list3 = List("01 hadoop","02 flume","03 java","04 kafka")
    //按照字母顺寻进行排序-->"01 hadoop" --> 根据元素中的单词部分进行排序（怎么会的单词部分）
    //--->根据空格进行切割 "01 hadoop"==》 [01,hadoop]--->单词部分的索引值为 1
    val ls2: List[String] = list3.sortBy(  _.split(" ")(1)   ) //  _  ==> "01 hadoop"     "02 flume"  "03 java"  "04 kafka"
    println(ls2)

    //3.sortWith
    var list4 = List(2,3,1,4,5)
    //将list4 按照降序进行排序
    val ls3: List[Int] = list4.sortWith((x, y) => x > y)
    println(ls3)
    /*
      此时 x和y 都是表示列表中的每个元素，并且x和y也是在固定位置。那么这样大家就习惯性找个东西来做替代，
        第一个 _ 表示 x   第二个 _ 表示 y
     */
    val ls4: List[Int] = list4.sortWith(_ > _)
    println(ls4)

    /*
    分组： 将数组按照指定条件进行分组 groupBy
    需求：1.将一个班的学生按照性别进行分组
         2.统计不同性别的人数
     */
    var list5 = List(  "张三"->"男", "李四"->"男",  "王五"->"女",  "赵六"->"女"         )
    val ls8: Map[String, List[(String, String)]] = list5.groupBy(_._2) //根据性别进行分组， "张三"->"男" == (”张三“,”男“)
    println(ls8)//HashMap(男 -> List((张三,男), (李四,男)), 女 -> List((王五,女), (赵六,女)))
    //统计性别的人数，
    val ls9: Map[String, Int] = ls8.map(x => (x._1, x._2.size))
    println(ls9)


    /*

     聚合操作： 将一个列表中的多个数据合并成一个
            reduce:用来对集合元素进行聚合计算
            fold:用来对集合元素进行折叠计算
     */
    var list6 = (1 to 10).toList
    //1.reduce :对集合元素进行聚合计算
    var res: Int = list6.reduce(_ + _)
    println(res)
    /*
     reduceLift: 将集合从左向右进行计算
     reduceRight：将集合从右向左进行计算
     */
    res = list6.reduceLeft(_ + _)
    println("redecuLeft:",res)
    res = list6.reduceRight(_ + _)
    println("redecuRight:",res)

    /*
     fold:和Reduce一样，但是多了一个初始值参数
           1.foldLeft:从左向右进行折叠计算
           2.foldRight:从右向左进行折叠计算
     */
    // 需求：定义一个列表1-10.假设初始值为100，求出列表中所有元素的和
    val list7 = (1 to 10).toList
     res = list7.fold(100)(_ + _)
    println(res)
    res = list7.foldLeft(100)(_+_)
    res = list7.foldRight(100)(_+_)
  }

}
